/**
 * 问题：
 * 实现一个函数功能
 * add(1)(2)(3) // 6
 * add(1, 2)(3) // 6
 * add(1, 2, 3) // 6
*/


/**
 * @param {Function} 接收一个多参, 参数定长函数
 * @return {Function} 返回一个单参调用的函数
*/
function curry(fn) {
  // 获取除fn之外的前置参数
  const args = Array.prototype.slice.call(arguments, 1)
  return function (...restArgs) {
    // 所有参数
    const allArgs = [...args, ...restArgs]
    if (allArgs.length >= fn.length) {
      // 传的所有参数之和达到fn的参数长度才调用fn
      return fn.call(null, ...allArgs)
    } else {
      // 否则递归调用curry
      return curry.call(null, fn, ...allArgs)
    }
  }
}


// 测试
function addFn(a, b, c) {
  return a + b + c
}
const add = curry(addFn)

console.log(add(1, 2, 3)) // 6
console.log(add(1, 2)(3)) // 6
console.log(add(1)(2)(3)) // 6
console.log(add(1)(2)(3)(4)) // 6, 参数长度超过3, 只返回前3个参数之和
